/* COGNOM1: Pardo COGNOM2: Fernandez NOM: Alex DNI: 47772179-Y
 *
 *  integracio.c
 *
 */

#include <stdlib.h>
#include <stdio.h>
#include <math.h>

double f(double);
double trapezis(double a,double b,int n){
	double h;
	double sol;
	double x;
	int i;
	h = (b-a)/n;
	x = a;
	sol = f(a);  /*primer element de trapezis composat*/
	for (i = 1; i < n; i++) { /*itero des de 1 fins n-1 */
		x = a + i*h;  /*es van calculant les x de l'interval*/
		sol = sol + 2.*f(x);  /*es va acumulant la solucio parcial*/
	}
	x = a + n*h;  /*Calculo l'ultima x per aquest interval*/
	sol = sol + f(x);  /*calculo l'ultim element de trapezis composat*/
	sol = sol * h/2.;  
	return sol;
}


double Romberg(double a,double b,int m,double tol,int iter){
	double* v;
	double aux, res;
	int i,pot,j,pas;
	aux = 0;
	i = 0;
	pot = 4;
	pas = 2;
	v = malloc((iter+1)*sizeof(double *));
	v[0] = trapezis(a,b,m);
	i++;
	while ((fabs(v[0]-aux) > tol) && (i <= iter)) {  /*itero fins que arribi a una solucio acceptable
													  o hem passi dels iterats*/
		aux = v[0]; /* guardo a aux la ultima solucio */
		v[i]=trapezis(a,b,pas*m); /*calculo el nou v[i]*/
		for (j = i-1; j >= 0; j--) {
			v[j] = (v[j+1]+((v[j+1] - v[j])/(pot-1))); /*Calculo tots els elements des de v[i-1]
														fins v[0] ambdos inclosos*/
			pot = pot * 4;
		}
		i++;
		pot = 4;
		pas = pas * 2;
	}
	res = v[0]; /*guardo el resultat per a poder alliberar memoria*/
	free(v);
	return res;
}